package com.example.springbootstudy02configuration.config;

import com.example.springbootstudy02configuration.bean.Human;
import com.example.springbootstudy02configuration.bean.Pet;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;


/**{@code @Configuration}相当于Spring中bean的配置文件,默认单实例（也就是调用的对象都是容器中的单实例，会在容器中保存代理对象）
*<p>@Configuration注解中也含有@Component，所以配置类本身也是组件
 *<p>@Configurationproxy中proxyBeanMethods选项是设置bean的代理方法，设置为false时，容器不会保存代理对象，每次调用都会产生新的对象
 * <p>proxyBeanMethods选项中的true和false分别对应了lite（轻量）模式和full（全）模式
 * <p>如果我们只是注册一些组件，且组件不依赖别的组件时，推荐使用lite模式，加速启动器的启动时间，减少判断时间，否则就使用full模式
 * <p><p>{@code @Import}是在容器中创建该类型的组件,组件id时他们的全类名
 * <p><p>{@code @Conditiona}注解是按照条件注册注解,可用在@Configuration和@Bean上,需要在注解里添加一个或多个继承Condition接口的判断方法
 * <p>{@code @Conditiona}注解自身也有一些派生注解,能解决常用条件判断
 * */
@Configuration
@Import(Human.class)
public class Config {


/**将方法作为一个组件,放在容器中,
 *方法名作为id,返回类型就是组件类型,返回值是组件中的实例
 */
    @Bean
    public Human user(){
        /** 在使用单例模式时，pet()使用的是代理对象，否则会创建一个新的对象*/
        return new Human("张三",18,pet());
    }
    @Bean
    public Pet pet(){
        return new Pet("咪咪",96);
    }
}
